package key.web.controller;


import key.util.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * BaseServlet用于集中处理方法的调用！
 * 以及返回值处理！
 * 以及默认页对应方法！
 */
public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求参数（标识符）
        String methodStr = req.getParameter(Constants.TAG);
        //2.如果method没有获取到值！我们就跳转到首页！（标识符异常处理）
        if (methodStr == null && methodStr.equals("")) {
            methodStr = Constants.INDEX;
        }
        //3.反射调用对应的业务逻辑方法
        Class clazz = this.getClass();
        try {
            //获取当前实例调用的方法
            Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);
            String result = (String) method.invoke(this, req, resp);
            //4.集中处理返回值响应
            if (result != null) {
                //转发 重定向  返回字符
                if (result.startsWith(Constants.FORWARD)) {
                    //转发
                    //截取获取的地址":"的下标+1，表示取forward之后除了冒号之后的转发地址
                    String path = result.substring(result.indexOf(Constants.FLAG) + 1);
                    req.getRequestDispatcher(path).forward(req, resp);
                } else if (result.startsWith(Constants.REDIRECT)) {
                    //重定向
                    //截取获取的地址":"的下标+1，表示取redirect之后除了冒号之后的重定向地址
                    String path = result.substring(result.indexOf(Constants.FLAG) + 1);
                    resp.sendRedirect(path);
                } else {
                    //ajax语句
                    resp.getWriter().println(result);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            //controller 和 service dao 有异常都会到此处！
            req.getSession().setAttribute("msg", "程序异常!请稍后再试！");
            resp.sendRedirect("/message.jsp");
        }
    }

    /**
     * 当method标识符‘没有值’ 我们默认赋 index 访问每个controller的index方法！
     * 我们将方法提取到baseservlet中即可！
     * 默认处理：跳转到程序的首页！
     */
    public String index(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
        return Constants.FORWARD + "/index.jsp";
    }
}
